<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>667. 优美的排列 II</title>
  </head>
  <body>
    <script>
      //       给你两个整数 n 和 k ，请你构造一个答案列表 answer ，该列表应当包含从 1 到 n 的 n 个不同正整数，并同时满足下述条件：

      // 假设该列表是 answer = [a1, a2, a3, ... , an] ，那么列表 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] 中应该有且仅有 k 个不同整数。
      // 返回列表 answer 。如果存在多种答案，只需返回其中 任意一种 。

      //

      // 示例 1：

      // 输入：n = 3, k = 1
      // 输出：[1, 2, 3]
      // 解释：[1, 2, 3] 包含 3 个范围在 1-3 的不同整数，并且 [1, 1] 中有且仅有 1 个不同整数：1
      // 示例 2：

      // 输入：n = 3, k = 2
      // 输出：[1, 3, 2]
      // 解释：[1, 3, 2] 包含 3 个范围在 1-3 的不同整数，并且 [2, 1] 中有且仅有 2 个不同整数：1 和 2
      //

      // 提示：

      // 1 <= k < n <= 104

      // 来源：力扣（LeetCode）
      // 链接：https://leetcode.cn/problems/beautiful-arrangement-ii
      // 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

      /**
       * @param {number} n
       * @param {number} k
       * @return {number[]}
       */
      var constructArray = function (n, k) {
        const set = new Set([1])
        let start = 1
        for (let i = k; i > 1; i--) {
          if (start - i > 1 && start - i <= k && !set.has(start - i)) {
            set.add((start -= i))
          } else {
            set.add((start += i))
          }
        }
        // 将剩余的数字排进去
        for (let i = 1; i <= n; i++) {
          if (!set.has(i)) {
            set.add(i)
          }
        }
        return [...set]
      }
    </script>
  </body>
</html>
